<?php
class Gest_contenidos extends MY_Controller {

	public function __construct()
    {
    	# Al constructor le envío la clase Controlador, y el nombre de la entidad gestionada
    	parent::__construct(get_class($this), 'gest_contenido');

    	$this->title = 'Contenido';
		$this->CARPETA_VISTAS = 'contenido/';
		$this->nombre_entidad = 'Contenido';
		$this->nombre_entidad_plural = $this->nombre_entidad . 's';

		$this->pagina_ver = $this->CARPETA_VISTAS . 'contenido_ver_todos_view';
		$this->pagina_editar = $this->CARPETA_VISTAS . 'contenido_edit_view';
		$this->pagina_filtros_ver = $this->CARPETA_VISTAS . 'contenido_filtros_ver_todos_view';

		$this->exportarExcelPermitido = FALSE;
	}

	/* IMPORTANTE: DEBE existir esta función. 
	 * Crea un objeto de la entidad correspondiente y lo pobla con la información obtenida a 
	 * partir del formulario recibido a través de POST.	*/
	protected function getObjetoDesdeForm()
	{
		$idEntidad = is_numeric($this->input->post('txt_id')) ? $this->input->post('txt_id') : NULL;
		
		$objEntidad = $this->getObjeto($idEntidad);
		$objEntidad->fecha = parent::fechaFormatoBD($this->input->post('txt_fecha'));
		$objEntidad->titulo = $this->input->post('txt_titulo');
		$objEntidad->descripcion_breve = $this->input->post('txt_descripcion_breve');
		$objEntidad->contenido = $this->input->post('txt_contenido');
		$objEntidad->favorito = $this->input->post('chk_favorito');
		$objEntidad->enlace = $this->input->post('txt_enlace');
		$objEntidad->usuario = $_SESSION[$this->template->getUsernameSessionName()];

		$datos['objEntidad'] = $objEntidad;
		
		$id_clasificacion = is_numeric($this->input->post('sel_clasificacion')) ? $this->input->post('sel_clasificacion') : NULL;
		$datos['objRelacionados'] = array(new Gest_clasificacion($id_clasificacion));

		return $datos;
	}

	/* IMPORTANTE: DEBE existir esta función. 
	 * Carga en el arreglo que luego se pasarán a las vistas, los datos correspondientes a otras entidades que se
	 * necesiten. Por ejemplo, en este método deben cargarse las entidades a las que puede asociarse o relacionarse
	 * la entidad actual. Si no se requiriesen, no se agrega nada. */
	protected function cargarDatosRelacionados($dataView)
	{
	    $opcionesSel = array();
	    $listado_etiquetas = array();
		if(isset($dataView['id_contenido'])) {
			$obj_contenido = new Gest_contenido($dataView['id_contenido']);
			foreach ($obj_contenido->gest_etiqueta->get() as $etiqueta) {
				$opcionesSel[] = $etiqueta->id;
				$listado_etiquetas[] = $etiqueta;
			}
		}
		$dataView['opcionesSel'] = $opcionesSel;
		$dataView['listado_etiquetas'] = $listado_etiquetas;

		// Creo un objeto del modelo, para poder buscar todos los datos en la BD
		$obj_clasificacion = new Gest_clasificacion();
		$dataView['listado_clasificaciones'] = $obj_clasificacion->get_iterated();

		return $dataView;
	}

	/* IMPORTANTE: DEBE existir esta función. 
	 * Obtiene el listado de elementos de acuerdo a los filtros que se hayan establecido y enviado a través
	 * del método POST. Devuelve un detalle de los filtros aplicados (o vacío si no hubiera filtros)	*/	
	protected function _aplicarFiltros($dataView = array())
	{
		// Creo un objeto del modelo, para poblarlo con los datos que necesito mostrar
		$objEntidad = $this->getObjeto();
		$detalle_filtros = '';

		$fecha_desde = parent::fechaFormatoBD($this->input->post('f_txt_fecha_desde'));
		if(!empty($fecha_desde)) {
			$objEntidad->where('fecha >=', $fecha_desde); 
			$detalle_filtros .= (!empty($detalle_filtros) ? ' | ' : '') . 'Fecha desde ' . $fecha_desde;
		}

		$fecha_hasta = parent::fechaFormatoBD($this->input->post('f_txt_fecha_hasta'));
		if(!empty($fecha_hasta)) {
			$objEntidad->where('fecha <=', $fecha_hasta); 
			$detalle_filtros .= (!empty($detalle_filtros) ? ' | ' : '') . 'Fecha hasta ' . $fecha_hasta;
		}

		$titulo = trim($this->input->post('f_txt_titulo'));
		if(!empty($titulo)) { 
			$objEntidad->like('titulo', $titulo); 
			$detalle_filtros .= (!empty($detalle_filtros) ? ' | ' : '') . 'Título => ' . $titulo;
		}

		$clasificacion = $this->input->post('f_sel_clasificacion');
		if($clasificacion != 0) {
			$objEntidad->where('gest_clasificacion_id', $clasificacion); 
			$detalle_filtros .= (!empty($detalle_filtros) ? ' | ' : '') . 'Clasificación ';
		}

		$contenido = trim($this->input->post('f_txt_contenido'));
		if(!empty($contenido)) { 
			$objEntidad->like('descripcion_breve', $contenido);
			$objEntidad->or_like('contenido', $contenido); 
			$detalle_filtros .= (!empty($detalle_filtros) ? ' | ' : '') . 'Contenido => ' . $contenido;
		}

		$objEntidad->order_by('fecha', 'desc');
		
		$dataView['objEntidad'] = $objEntidad;
		$dataView['detalle_filtros'] = $detalle_filtros;

		return $dataView;
	}

	/* IMPORTANTE: DEBE existir esta función.
	 * Valida las condiciones que deben cumplirse para que un elemento pueda ELIMINARSE. */
	protected function validarEliminacion($id_elemento)
	{
		return FALSE;
	}

	/* IMPORTANTE: DEBE existir esta función.
	 * Valida las condiciones que deben cumplirse para que un elemento pueda EDITARSE. */
	protected function validarEdicion($id_elemento)
	{
		return TRUE;
	}

	public function cambiar_estado($id_elemento)
	{
		$dataView['title'] = 'Cambiar estado del ' . $this->nombre_entidad;

		if(isset($_SESSION[$this->template->getIdUserSessionName()])) {
			// Se obtiene el objeto que se desea eliminar
			$obj_contenido = $this->getObjeto($id_elemento);

			if(!$obj_contenido->baja) {
				$obj_contenido->baja = TRUE;
				$obj_contenido->fecha_baja = date($this->formatoFechaGuardar);
			}
			else $obj_contenido->baja = FALSE;

			$obj_contenido->usuario = $_SESSION[$this->template->getUsernameSessionName()];

			// Se manejan transacciones para interactuar con la BD
			$obj_contenido->trans_begin();
			$obj_contenido->save();
			if ($obj_contenido->trans_status() === FALSE) // Se chequea el estado de la transacción
			{
			    $obj_contenido->trans_rollback(); // Si la transacción falló, hago un rollback
			}
			else
			{
			    $obj_contenido->trans_commit(); // Transacción exitosa, realizo el commit
			}

			$dataView['error'] = $obj_contenido->error->string; // Almaceno todos los errores que hubieran podido ocurrir
		}
		else $dataView['error'] = 'No se ha iniciado sesión.';

		$this->ver_todos($dataView);
	}

	public function editar($id_elemento = NULL, $opcion = 1)
	{
		$dataView = array();
		$objEntidad = $this->getObjeto($id_elemento);
		$edicionStandard = TRUE;
		switch ($opcion) {
			case 1:
				# Opción por defecto. Es la edición común
				break;

			case 2:
				# Cambiar etiquetas relacionadas
				$dataView['title'] = "Definir etiquetas de '"  . $objEntidad->titulo . "'";
				$dataView['nombre_controlador'] = 'gest_contenidos_etiquetas';
				$dataView['pagina_editar'] =  $this->CARPETA_VISTAS . 'contenido_etiqueta_edit_view';
				$dataView['id_contenido'] = $id_elemento;
				break;

			default:
				break;
		}
		$dataView['objEntidad'] = $objEntidad;
		
		parent::_cargarFormEdicion($dataView);
	}
}